package com.cloud.xtools.common.aspect;

import com.cloud.xtools.common.annotation.Permission;
import com.cloud.xtools.common.exception.PermissionException;
import com.cloud.xtools.common.redis.RedisService;
import com.cloud.xtools.common.util.Auth;
import com.cloud.xtools.common.util.Dump;
import lombok.RequiredArgsConstructor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author Daixinguo
 */
@Aspect
@Component
@RequiredArgsConstructor
public class PermissionAspect {

    @Around("@annotation(permission)")
    // 方法参数 joinPoint 表示被拦截的方法的连接点。
    // 方法参数 permission 表示 @Permission 注解的实例。
    public Object checkPermission(ProceedingJoinPoint joinPoint, Permission permission) throws Throwable {
        // 从请求对象中获取当前用户拥有的权限
        String[] permissions = Auth.getRequest().getAttribute("permissions").toString().split(",");
        Set<String> allPermissions = new HashSet<>(Arrays.asList(permissions));
        // System.out.println("PermissionAspect-allPermissions");
        // Dump.json(allPermissions);
        //
        // System.out.println("PermissionAspect-permission");
        // Dump.json(permission.value());
        List<String> methodPermissions = Arrays.asList(permission.value());
        // Dump.json(methodPermissions);

        if(!allPermissions.containsAll(methodPermissions)){
            throw  new PermissionException("您没有当前操作权限！");
        }

        // 如果权限检查通过，则调用 joinPoint.proceed() 执行被拦截的方法，并返回其结果。
        return joinPoint.proceed();
    }
}
